package com.lxl.config;

import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTHeader;

import java.util.Date;

public class JWTTest {

    // ak/sk是一种身份认证方式，常用于系统间接口调用时的身份验证，其中ak为Access Key ID，sk为Secret Access Key。
    // 客户端和服务端两者会协商保存一份相同的sk，其中sk必须保密。
    // 客户端在调用的服务端接口时候，会带上ak以及signature（使用sk对内容进行加密后得出的签名）进行请求，在服务端接收到这个请求的时候，
    // 首先会根据ak去数据库里面去找到对应的sk，然后使用sk对请求内容进行加密得到一个签名，然后对比客户端传过来的签名和服务端计算的出来的签名是否一致，如果一致则代表身份认证通过，反之则不通过。

    static String ak = "2ZDIKhlGCWbXk67WdDoWPwBcwJz"; // 填写您的ak
    static String sk = "1234567893223"; // 填写您的sk

    public static void main(String[] args) {
        String token = sign(ak, sk);
        System.out.println(token); // 打印生成的API_TOKEN

        //String rightToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9." + "eyJzdWIiOiIxMjM0NTY3ODkwIiwiYWRtaW4iOnRydWUsIm5hbWUiOiJsb29seSJ9." + "536690902d931d857d2f47d337ec81048ee09a8e71866bcc8404edbbcbf4cc40";

        // 密钥
        byte[] key = "123456789".getBytes();

        boolean flag = JWT.of(token).setKey(key).verify();
        System.out.println("flag = " + flag);
        // 默认验证HS265的算法
        JWT jwt = JWT.of(token).setKey(key);


        // JWT
        jwt.getHeader(JWTHeader.TYPE);
        // HS256
        jwt.getHeader(JWTHeader.ALGORITHM);

        // 1234567890
        Object iss = jwt.getPayload("iss");

        // looly
        jwt.getPayload("name");
        // true
        jwt.getPayload("admin");


    }

    static String sign(String ak, String sk) {
        try {
            Date expiredAt = new Date(System.currentTimeMillis() + 1800 * 1000);
            Date notBefore = new Date(System.currentTimeMillis() - 5 * 1000);
            byte[] key = sk.getBytes();
            return JWT.create().setKey(key).setPayload("iss", ak).setPayload("exp", expiredAt).setPayload("nbf", notBefore).sign();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}